function creerTableauVide(nbCasesLigneRegion, nbCasesColonneRegion) {

    document.write('<table class="tableau" cellpadding="0" cellspacing="0">');
    document.write('<tbody>');
	
    for(i = 1; i<=nbCasesLigneRegion; i++) {
		
		document.write('<tr>');
	
		for(j = 1; j<=nbCasesColonneRegion; j++) {
		
		    region = (i - 1) * nbCasesColonneRegion + j;
	
		    document.write('<td class="ligne">');
		    document.write('<table class="region" id="R' + region + '" cellpadding="0" cellspacing="0">');
		    document.write('<tbody>');
	
		    for(k = 1; k<=nbCasesColonneRegion; k++) {
		
				document.write('<tr>');
		
				for(l = 1; l<=nbCasesLigneRegion; l++) {
		
				    ligne = (i - 1) * nbCasesColonneRegion + k;
				    colonne = (j - 1) * nbCasesLigneRegion + l;
		
				    document.write('<td class="ligne">');
				    document.write('<input name="cellule" id="L' + ligne + 'C' + colonne + '" type="text" class="cellule" onfocus="select();" maxlength="1" />');
				    document.write('</td>');
				}
					
				document.write('</tr>');
		    }
		
		    document.write('</tbody>');
		    document.write('</table>');
		    document.write('</td>');
		}
	
		document.write('</tr>');
    }

    document.write('</tbody>');
    document.write('</table>');
    
    colorizeRegionPaire();
}

function GrilleBean(cases) {
    this.cases = cases;
}

function CaseBean(ligne, colonne, valeur, initiale) {
    this.ligne = ligne;
    this.colonne = colonne;
    this.valeur = valeur;
    this.initiale = initiale;
}

function getNbCasesCoteGrille() {
	return Math.sqrt(document.forms["sudoku"].elements["cellule"].length);
}

function getGrille() {

	var grille = new GrilleBean(Array());
    longueurCote = getNbCasesCoteGrille();
    cpt = 0;    

    for (i = 1; i<=longueurCote; i++) {
		for (j = 1; j<=longueurCote; j++) {
			cellule = getCellule(i, j);
		    valeur = cellule.value;
		    initiale = cellule.className == "celluleInitiale";
	        grille.cases[cpt] = new CaseBean(i, j, valeur, initiale);
	        cpt++;
		}
   	}

//    alert(JSON.stringify(grille));
    return JSON.stringify(grille);

}

function setGrille(jsonText) {

    resetTableau();

    jsonObject = JSON.parse(jsonText);

    for(i = 0; i<jsonObject.cases.length; i++) {
		cellulejson = jsonObject.cases[i];
		cellule = getCellule(cellulejson.ligne, cellulejson.colonne);
		cellule.value = cellulejson.valeur;
		cellule.className = "cellule";
		if (cellulejson.initiale) {
			cellule.className = "celluleInitiale";
    	}
    }
}

function getCellule(ligne, colonne) {
	return document.forms["sudoku"].elements["L" + ligne + "C" + colonne];
}

function getLigne(cellule) {
	id = cellule.id;
	return parseInt(id.substring(1, id.indexOf("C", 2)));
}

function getColonne(cellule) {
	id = cellule.id;
	return parseInt(id.substring(id.indexOf("C", 2) + 1, id.length));
}

function getCelluleSuivante(cellule) {
	
	ligne = getLigne(cellule);
	colonne = getColonne(cellule)
	longueurCote = getNbCasesCoteGrille();
	
	if (colonne < longueurCote) {
		return getCellule(ligne, colonne + 1);
	} else if(ligne < longueurCote) {
		return getCellule(ligne + 1, 1);
	} else {
		return cellule;
	}	
}

function getCellulePrecedente(cellule) {
	
	ligne = getLigne(cellule);
	colonne = getColonne(cellule)
	longueurCote = getNbCasesCoteGrille();
	
	if (colonne > 1) {
		return getCellule(ligne, colonne - 1);
	} else if(ligne > 1) {
		return getCellule(ligne - 1, longueurCote);
	} else {
		return cellule;
	}	
}

function getCelluleEnDessous(cellule) {
	
	ligne = getLigne(cellule);
	colonne = getColonne(cellule)
	longueurCote = getNbCasesCoteGrille();
	
	if (ligne < longueurCote) {
		return getCellule(ligne + 1, colonne);
	} else {
		return cellule;
	}	
}

function getCelluleAuDessus(cellule) {
	
	ligne = getLigne(cellule);
	colonne = getColonne(cellule)
	
	if (ligne > 1) {
		return getCellule(ligne - 1, colonne);
	} else {
		return cellule;
	}	
}

function resetTableau() {
    $('input[name="cellule"]').val("").addClass("celluleInitiale").removeAttr("disabled");
}

function activeTableau() {
    $('input[name="cellule"]').addClass("celluleInitiale").removeAttr("disabled");
    $(".cellule").val("");
}

function desactiveTableau() {
	$('input[name="cellule"]').attr("disabled", "disabled"); 
}

function afficherBouton(button, affiche) {
	if (affiche) {
		$('a[name="' + button + '"]').show();
	} else {
		$('a[name="' + button + '"]').hide();
	}
}

function colorizeRegionPaire() {
	
	longueurCote = getNbCasesCoteGrille();
	regions = new Array();
	
	for(i = 1; i<=longueurCote; i++) {
		if (i%2==0) {
			region = "R" + i;
			regions.push(region);
		}
	}
	
	$('input[name="cellule"]').each(function () {
		dansRegionPaire = $.inArray($(this).parents('.region').attr('id'), regions) != -1;
		if (dansRegionPaire) {
			$(this).css('backgroundColor', '#DDDDDD');
		}
	});
}

function init() {
	
	 afficherBouton("nouvelleGrille", false);
	 afficherBouton("completeGrille", false);
	 
	 $('input[name="cellule"]').keyup(function(event) {
		 if (event.keyCode == '37') {
			 getCellulePrecedente(this).focus();
		 } else if (event.keyCode == '38') {
			 getCelluleAuDessus(this).focus();
		 } else if (event.keyCode == '39') {
			 getCelluleSuivante(this).focus();
		 } else if (event.keyCode == '40') {
			 getCelluleEnDessous(this).focus();
		 } else if ((event.keyCode >= '48' && event.keyCode <= '90') || (event.keyCode >= '96' && event.keyCode <= '105')) {
			 $(this).addClass("celluleInitiale");
			 getCelluleSuivante(this).focus();
		 }
	 });
	 
	 $('a[name="resoudreGrille"]').click(function() {
		 afficherBouton("resoudreGrille", false);
		 afficherBouton("chargeGrille1", false);
		 afficherBouton("chargeGrille2", false);
		 afficherBouton("nouvelleGrille", true);
		 afficherBouton("completeGrille", true);
		 document.applets["SudokuApplet"].actionPerformed(this.name, getGrille());
		 desactiveTableau();	 
	 });

	 $('a[name="chargeGrille1"]').click(function() {
		 afficherBouton("resoudreGrille", true);
		 afficherBouton("chargeGrille1", false);
		 afficherBouton("chargeGrille2", false);
		 afficherBouton("nouvelleGrille", false);
		 afficherBouton("completeGrille", false);
		 document.applets["SudokuApplet"].actionPerformed(this.name, getGrille());
	 });

	 $('a[name="chargeGrille2"]').click(function() {
		 afficherBouton("resoudreGrille", true);
		 afficherBouton("chargeGrille1", false);
		 afficherBouton("chargeGrille2", false);
		 afficherBouton("nouvelleGrille", false);
		 afficherBouton("completeGrille", false);
		 document.applets["SudokuApplet"].actionPerformed(this.name, getGrille());
	 });

	 $('a[name="nouvelleGrille"]').click(function() {
		 afficherBouton("resoudreGrille", true);
		 afficherBouton("chargeGrille1", true);
		 afficherBouton("chargeGrille2", true);
		 afficherBouton("nouvelleGrille", false);
		 afficherBouton("completeGrille", false);
		 resetTableau();
		 document.applets["SudokuApplet"].actionPerformed(this.name, getGrille());
	 });
	 
	 $('a[name="completeGrille"]').click(function() {
		 afficherBouton("resoudreGrille", true);
		 afficherBouton("chargeGrille1", false);
		 afficherBouton("chargeGrille2", false);
		 afficherBouton("nouvelleGrille", false);
		 afficherBouton("completeGrille", false);
		 activeTableau();
		 document.applets["SudokuApplet"].actionPerformed(this.name, getGrille());
	 });
}
